home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / misc / interfaces3_5.lha / Interfaces / CDDevice.mod < prev    next >
Text File  |  1994-03-05  |  16KB  |  344 lines

  1. (*
  2. (*  Amiga Oberon Interface Module:
  3. **  $VER: CDDevice.mod 40.15 (28.12.93) Oberon 3.0
  4. **
  5. **      (C) Copyright 1993 Commodore-Amiga, Inc.
  6. **          All Rights Reserved
  7. **
  8. **      (C) Copyright Oberon Interface 1993 by hartmut Goebel
  9. *)          All Rights Reserved
  10. *)
  11.  
  12. MODULE CDDevice;
  13.  
  14. IMPORT
  15.   e * := Exec,
  16.   u * := Utility;
  17.  
  18. TYPE
  19.   TOCEntryPtr      * = UNTRACED POINTER TO TOCEntry;
  20.   TOCSummaryPtr    * = UNTRACED POINTER TO TOCSummary;
  21.   QCodeLSNPtr      * = UNTRACED POINTER TO QCodeLSN;
  22.   QCodeMSFPtr      * = UNTRACED POINTER TO QCodeMSF;
  23.   CDTOCLSNPtr      * = UNTRACED POINTER TO CDTOCLSN;
  24.   CDTOCMSFPtr      * = UNTRACED POINTER TO CDTOCMSF;
  25.   CDTOCPtr         * = UNTRACED POINTER TO CDTOC;
  26.   TOCEntryLSNPtr   * = UNTRACED POINTER TO TOCEntryLSN;
  27.   TOCEntryMSFPtr   * = UNTRACED POINTER TO TOCEntryMSF;
  28.   TOCSummaryLSNPtr * = UNTRACED POINTER TO TOCSummaryLSN;
  29.   TOCSummaryMSFPtr * = UNTRACED POINTER TO TOCSummaryMSF;
  30.   CDXLPtr          * = UNTRACED POINTER TO CDXL;
  31.   RLSNPtr          * = UNTRACED POINTER TO RLSN;
  32.   RMSFPtr          * = UNTRACED POINTER TO RMSF;
  33.   CDInfoPtr        * = UNTRACED POINTER TO CDInfo;
  34.  
  35.  
  36. (**************************************************************************
  37.  *                                                                        *
  38.  *   CD Commands                                                          *
  39.  *                                                                        *
  40.  **************************************************************************)
  41. CONST
  42.   reset         * = 1;
  43.   read          * = 2;
  44.   write         * = 3;
  45.   update        * = 4;
  46.   clear         * = 5;
  47.   stop          * = 6;
  48.   start         * = 7;
  49.   flush         * = 8;
  50.   motor         * = 9;
  51.   seek          * = 10;
  52.   format        * = 11;
  53.   remove        * = 12;
  54.   changeNum     * = 13;
  55.   changeState   * = 14;
  56.   protStatus    * = 15;
  57.  
  58.   getDriveType  * = 18;
  59.   getNumTracks  * = 19;
  60.   addChangeInt  * = 20;
  61.   remChangeInt  * = 21;
  62.   getGeometry   * = 22;
  63.   eject         * = 23;
  64.  
  65.  
  66.   info          * = 32;
  67.   config        * = 33;
  68.   tocMSF        * = 34;
  69.   tocLSN        * = 35;
  70.  
  71.   readXL        * = 36;
  72.  
  73.   playTrack     * = 37;
  74.   playMSF       * = 38;
  75.   playLSN       * = 39;
  76.   pause         * = 40;
  77.   search        * = 41;
  78.  
  79.   qCodeMSF      * = 42;
  80.   qCodeLSN      * = 43;
  81.   attenuate     * = 44;
  82.  
  83.   addFrameInt   * = 45;
  84.   remFrameInt   * = 46;
  85.  
  86.  
  87. (**************************************************************************
  88.  *                                                                        *
  89.  *   Device Driver Error Codes                                            *
  90.  *                                                                        *
  91.  **************************************************************************)
  92.  
  93.   errOpenFail       * = -1;    (* device/unit failed to open           *)
  94.   errAborted        * = -2;    (* request terminated early             *)
  95.   errNoCmd          * = -3;    (* command not supported by device      *)
  96.   errBadLength      * = -4;    (* invalid length (IO_LENGTH/IO_OFFSET) *)
  97.   errBadAddress     * = -5;    (* invalid address (IO_DATA misaligned) *)
  98.   errUnitBusy       * = -6;    (* device opens ok, but unit is busy    *)
  99.   errSelftest       * = -7;    (* hardware failed self-test            *)
  100.  
  101.   errNotSpecified   * = 20;    (* general catchall                     *)
  102.   errNoSecHdr       * = 21;    (* couldn't even find a sector          *)
  103.   errBadSecPreamble * = 22;    (* sector looked wrong                  *)
  104.   errBadSecID       * = 23;    (* ditto                                *)
  105.   errBadHdrSum      * = 24;    (* header had incorrect checksum        *)
  106.   errBadSecSum      * = 25;    (* data had incorrect checksum          *)
  107.   errTooFewSecs     * = 26;    (* couldn't find enough sectors         *)
  108.   errBadSecHdr      * = 27;    (* another "sector looked wrong"        *)
  109.   errWriteProt      * = 28;    (* can't write to a protected disk      *)
  110.   errNoDisk         * = 29;    (* no disk in the drive                 *)
  111.   errSeekError      * = 30;    (* couldn't find track 0                *)
  112.   errNoMem          * = 31;    (* ran out of memory                    *)
  113.   errBadUnitNum     * = 32;    (* asked for a unit > NUMUNITS          *)
  114.   errBadDriveType   * = 33;    (* not a drive cd.device understands    *)
  115.   errDriveInUse     * = 34;    (* someone else allocated the drive     *)
  116.   errPostReset      * = 35;    (* user hit reset; awaiting doom        *)
  117.   errBadDataType    * = 36;    (* data on disk is wrong type           *)
  118.   errInvalidState   * = 37;    (* invalid cmd under current conditions *)
  119.  
  120.   errPhase          * = 42;    (* illegal or unexpected SCSI phase     *)
  121.   errNoBoard        * = 50;    (* open failed for non-existant board   *)
  122.  
  123.  
  124. (**************************************************************************
  125.  *                                                                        *
  126.  * Configuration                                                          *
  127.  *                                                                        *
  128.  *       The drive is configured by TagList items defined as follows:     *
  129.  *                                                                        *
  130.  **************************************************************************)
  131.  
  132.   playSpeed         * = 00001H;
  133.   readSpeed         * = 00002H;
  134.   readXLSpeed       * = 00003H;
  135.   sectorSize        * = 00004H;
  136.   xlECC             * = 00005H;
  137.   ejectReset        * = 00006H;
  138.  
  139.  
  140. (**************************************************************************
  141.  *                                                                        *
  142.  * Information                                                            *
  143.  *                                                                        *
  144.  *      Information/Status structure describes current speed settings     *
  145.  *      for read and play commands, sector size, audio attenuation        *
  146.  *      precision, and drive status.                                      *
  147.  *                                                                        *
  148.  **************************************************************************)
  149. TYPE
  150.   CDInfo * = STRUCT             (*                                Default     *)
  151.     playSpeed      * : INTEGER; (* Audio play speed               (75)        *)
  152.     readSpeed      * : INTEGER; (* Data-rate of CD_READ command   (Max)       *)
  153.     readXLSpeed    * : INTEGER; (* Data-rate of CD_READXL command (75)        *)
  154.     sectorSize     * : INTEGER; (* Number of bytes per sector     (2048)      *)
  155.     xlECC          * : INTEGER; (* CDXL ECC enabled/disabled                  *)
  156.     ejectReset     * : INTEGER; (* Reset on eject enabled/disabled            *)
  157.     reserved1      * : ARRAY 4 OF INTEGER; (* Reserved for future expansion   *)
  158.  
  159.     maxSpeed       * : INTEGER; (* Maximum speed drive can handle (75, 150)   *)
  160.     audioPrecision * : INTEGER; (* 0 = no attenuator, 1 = mute only,          *)
  161.                                 (* other = (# levels - 1)                     *)
  162.     status         * : INTEGER; (* See flags below                            *)
  163.     reserved2      * : ARRAY 4 OF INTEGER; (* Reserved for future expansion   *)
  164.   END;
  165.  
  166.  
  167. (* Flags for Status *)
  168. CONST
  169.   stsbClosed        * = 0;   (* Drive door is closed                        *)
  170.   stsbDisk          * = 1;   (* A disk has been detected                    *)
  171.   stsbSpin          * = 2;   (* Disk is spinning (motor is on)              *)
  172.   stsbTOC           * = 3;   (* Table of contents read.  Disk is valid.     *)
  173.   stsbCDRom         * = 4;   (* Track 1 contains CD-ROM data                *)
  174.   stsbPlaying       * = 5;   (* Audio is playing                            *)
  175.   stsbPaused        * = 6;   (* Pause mode (pauses on play command)         *)
  176.   stsbSearch        * = 7;   (* Search mode (Fast Forward/Fast Reverse)     *)
  177.   stsbDirection     * = 8;   (* Search direction (0 = Forward, 1 = Reverse) *)
  178.  
  179. (* Modes for CD_SEARCH *)
  180.  
  181.   normal        * = 0;    (* Normal play at current play speed    *)
  182.   fFwd          * = 1;    (* Fast forward play (skip-play forward)*)
  183.   fRev          * = 2;    (* Fast reverse play (skip-play reverse)*)
  184.  
  185.  
  186. (**************************************************************************
  187.  *                                                                        *
  188.  * Position Information                                           *
  189.  *                                                                        *
  190.  *      Position information can be described in two forms: MSF and LSN   *
  191.  *      form.  MSF (Minutes, Seconds, Frames) form is a time encoding.    *
  192.  *      LSN (Logical Sector Number) form is frame (sector) count.         *
  193.  *      The desired form is selected using the io_Flags field of the      *
  194.  *      IOStdReq structure.  The flags and the union are described        *
  195.  *      below.                                                            *
  196.  *                                                                        *
  197.  **************************************************************************)
  198. TYPE
  199.   RMSF * = STRUCT          (* Minute, Second, Frame  *)
  200.     reserved * : SHORTINT; (* Reserved (always zero) *)
  201.     minute   * : SHORTINT; (* Minutes (0-72ish)      *)
  202.     second   * : SHORTINT; (* Seconds (0-59)         *)
  203.     frame    * : SHORTINT; (* Frame   (0-74)         *)
  204.   END;
  205.  
  206.   RLSN * = STRUCT
  207.     lsn * : LONGINT;       (* Logical Sector Number  *)
  208.   END;
  209.  
  210. (**************************************************************************
  211.  *                                                                        *
  212.  * CD Transfer Lists                                                      *
  213.  *                                                                        *
  214.  *      A CDXL node is a double link node; however only single linkage    *
  215.  *      is used by the device driver.  If you wish to construct a         *
  216.  *      transfer list manually, it is only neccessary to define the       *
  217.  *      mln_Succ pointer of the MinNode.  You may also use the Exec       *
  218.  *      list functions by defining a List or MinList structure and by     *
  219.  *      using the AddHead/AddTail functions to create the list.  This     *
  220.  *      will create a double-linked list.  Although a double-linked       *
  221.  *      list is not required by the device driver, you may wish use it    *
  222.  *      for your own purposes.  Don't forget to initialize the            *
  223.  *      the List/MinList before using it!                                 *
  224.  *                                                                        *
  225.  **************************************************************************)
  226.  
  227.   CharPtr * = e.APTR;
  228.  
  229.   CDXL * = STRUCT (node *: e.MinNode) (* double linkage          *)
  230.     buffer  * : CharPtr;      (* data destination (word aligned) *)
  231.     length  * : LONGINT;      (* must be even # bytes            *)
  232.     actual  * : LONGINT;      (* bytes transferred               *)
  233.     intData * : e.APTR;       (* interrupt server data segment   *)
  234.     intCode * : e.PROC;       (* interrupt server code entry     *)
  235.   END;
  236.  
  237.  
  238. (**************************************************************************
  239.  *                                                                        *
  240.  * CD Table of Contents                                           *
  241.  *                                                                        *
  242.  *      The CD_TOC command returns an array of CDTOC entries.             *
  243.  *      Entry zero contains summary information describing how many       *
  244.  *      tracks the disk has and the play-time of the disk.                *
  245.  *      Entries 1 through N (N = Number of tracks on disk) contain        *
  246.  *      information about the track.                                      *
  247.  *                                                                        *
  248.  **************************************************************************)
  249.  
  250.   TOCSummary *= STRUCT END;
  251.   TOCSummaryMSF * = STRUCT (dummy *:TOCSummary)
  252.     firstTrack * : SHORTINT; (* First track on disk (always 1)            *)
  253.     lastTrack  * : SHORTINT; (* Last track on disk                        *)
  254.     leadOut    * : RMSF;     (* Beginning of lead-out track (end of disk) *)
  255.   END;
  256.  
  257.   TOCSummaryLSN * = STRUCT (dummy *:TOCSummary)
  258.     firstTrack * : SHORTINT; (* First track on disk (always 1)            *)
  259.     lastTrack  * : SHORTINT; (* Last track on disk                        *)
  260.     leadOut    * : RLSN;     (* Beginning of lead-out track (end of disk) *)
  261.   END;
  262.  
  263.  
  264.   TOCEntry *= STRUCT END;
  265.   TOCEntryMSF * = STRUCT (dummy *: TOCEntry)
  266.     ctlAdr   * : SHORTINT;   (* Q-Code info                  *)
  267.     track    * : SHORTINT;   (* Track number                 *)
  268.     position * : RMSF;       (* Start position of this track *)
  269.   END;
  270.  
  271.   TOCEntryLSN * = STRUCT (dummy *: TOCEntry)
  272.     ctlAdr   * : SHORTINT;   (* Q-Code info                  *)
  273.     track    * : SHORTINT;   (* Track number                 *)
  274.     position * : RLSN;       (* Start position of this track *)
  275.   END;
  276.  
  277.  
  278.   CDTOC * = STRUCT END;
  279.   CDTOCMSF * = STRUCT (dummy *: CDTOC)
  280.     summary * : TOCSummaryMSF;            (* First entry (0) is summary information *)
  281.     entry   * : ARRAY 256 OF TOCEntryMSF; (* Entries 1-N are track entries          *)
  282.   END;
  283.  
  284.   CDTOCLSN * = STRUCT (dummy *: CDTOC)
  285.     summary * : TOCSummaryLSN;            (* First entry (0) is summary information *)
  286.     entry   * : ARRAY 256 OF TOCEntryLSN; (* Entries 1-N are track entries          *)
  287.   END;
  288.  
  289.  
  290. (**************************************************************************
  291.  *                                                                        *
  292.  * Q-Code Packets                                                         *
  293.  *                                                                        *
  294.  *      Q-Code packets are only returned when audio is playing.   *
  295.  *      Currently, only position packets are returned (ADR_POSITION)      *
  296.  *      The other ADR_ types are almost never encoded on the disk         *
  297.  *      and are of little use anyway.  To avoid making the QCode          *
  298.  *      structure a union, these other ADR_ structures are not defined.   *
  299.  *                                                                        *
  300.  **************************************************************************)
  301.  
  302.   QCodeMSF * = STRUCT
  303.     ctlAdr        * : SHORTINT; (* Data type / QCode type           *)
  304.     track         * : SHORTINT; (* Track number                     *)
  305.     index         * : SHORTINT; (* Track subindex number            *)
  306.     zero          * : SHORTINT; (* The "Zero" byte of Q-Code packet *)
  307.     trackPosition * : RMSF;     (* Position from start of track     *)
  308.     diskPosition  * : RMSF;     (* Position from start of disk      *)
  309.   END;
  310.  
  311.   QCodeLSN * = STRUCT
  312.     ctlAdr        * : SHORTINT; (* Data type / QCode type           *)
  313.     track         * : SHORTINT; (* Track number                     *)
  314.     index         * : SHORTINT; (* Track subindex number            *)
  315.     zero          * : SHORTINT; (* The "Zero" byte of Q-Code packet *)
  316.     trackPosition * : RLSN;     (* Position from start of track     *)
  317.     diskPosition  * : RLSN;     (* Position from start of disk      *)
  318.   END;
  319.  
  320. CONST
  321.   ctlAdrCtlMask     * = 0F0H;   (* Control field *)
  322.  
  323.   ctlCtlMask        * = 0D0H;   (* To be ANDed with CtlAdr before compared  *)
  324.  
  325.   ctl2Aud           * = 000H;   (* 2 audio channels without preemphasis     *)
  326.   ctl2AudEmph       * = 010H;   (* 2 audio channels with preemphasis        *)
  327.   ctl4Aud           * = 080H;   (* 4 audio channels without preemphasis     *)
  328.   ctl4AudEmph       * = 090H;   (* 4 audio channels with preemphasis        *)
  329.   ctlData           * = 040H;   (* CD-ROM Data                              *)
  330.  
  331.   ctlCopyMask       * = 020H;   (* To be ANDed with CtlAdr before compared  *)
  332.  
  333.   ctlCopy           * = 020H;   (* When true, this audio/data can be copied *)
  334.  
  335.   ctlAdrAdrMask     * = 00FH;   (* Address field                            *)
  336.  
  337.   adrPosition       * = 001H;   (* Q-Code is position information           *)
  338.   adrUPC            * = 002H;   (* Q-Code is UPC information (not used)     *)
  339.   adrISRC           * = 003H;   (* Q-Code is ISRC (not used)                *)
  340.   adrHybrid         * = 005H;   (* This disk is a hybrid disk               *)
  341.  
  342. END CDDevice.
  343.  
  344.